// condition_variable example
#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable

std::mutex mtx;
std::condition_variable cv;

bool ready = false;

void print_id (int id)
{
    std::unique_lock<std::mutex> lck(mtx);
    /// 这里的锁结合 cv 使用，处于一个 wait 的状态。此时，其他线程可以
    /// 继续。然而激活之后，这个锁也会继续，也就是说最先激活的线程，会
    /// 执行完剩下的指令，直到锁销毁。
    while (!ready)
	/// 一旦激活，此循环继续，此时如果 ready 变成 true，则循环结束。
	cv.wait(lck);
    // ...
    std::cout << "thread " << id << '\n';
}

void go()
{
    /// 也有一个锁，确保这个线程能完整的执行。
    std::unique_lock<std::mutex> lck(mtx);
    ready = true;
    /// 发出一个信号，所有线程的 cv 都能收到，作用是全部 wait 状态的线程被激活了...
    cv.notify_all();
}

int main ()
{
    std::thread threads[10];
    // spawn 10 threads:
    for (int i=0; i<10; ++i)
	threads[i] = std::thread(print_id,i);

    std::cout << "10 threads ready to race...\n";
    go();                       // go!

    for (auto& th : threads)
	th.join();

    return 0;
}
